{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "xK_aztGCj1o2"
   },
   "source": [
    "# LIMIT Dataset Generation\n",
    "\n",
    "This script provides code to generate a LIMIT-style dataset."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "EwOtsgFBjx2P"
   },
   "source": [
    "## Requirements"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-06T06:03:40.039748Z",
     "iopub.status.busy": "2025-09-06T06:03:40.039545Z",
     "iopub.status.idle": "2025-09-06T06:03:40.519293Z",
     "shell.execute_reply": "2025-09-06T06:03:40.518841Z",
     "shell.execute_reply.started": "2025-09-06T06:03:40.039733Z"
    },
    "id": "gRt7ZqRAK5_C",
    "tags": []
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import random\n",
    "import tqdm\n",
    "import math\n",
    "import json\n",
    "import itertools\n",
    "import requests\n",
    "\n",
    "random.seed(42)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "FAkejndglTis"
   },
   "source": [
    "## Download Names from open source lists (edit this as needed)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-09-06T06:03:45.601716Z",
     "iopub.status.busy": "2025-09-06T06:03:45.601400Z",
     "iopub.status.idle": "2025-09-06T06:04:02.180212Z",
     "shell.execute_reply": "2025-09-06T06:04:02.179668Z",
     "shell.execute_reply.started": "2025-09-06T06:03:45.601699Z"
    },
    "id": "pFrrdRhLlS77",
    "outputId": "8ec561f3-5ae1-4ce5-e94a-1e354b0ed3df",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "First five last names: ['Smith', 'Johnson', 'Williams', 'Brown', 'Jones']\n",
      "First 5 first names: ['Aaran', 'Aaren', 'Aarez', 'Aarman', 'Aaron']\n",
      "Found 2738 unique names and 1000 unique surnames.\n"
     ]
    }
   ],
   "source": [
    "\n",
    "\n",
    "# URL of the CSV file\n",
    "csv_url = \"https://gist.githubusercontent.com/craigh411/19a4479b289ae6c3f6edb95152214efc/raw/d25a1afd3de42f10abdea7740ed098d41de3c330/List%2520of%2520the%25201,000%2520Most%2520Common%2520Last%2520Names%2520(USA)\"\n",
    "\n",
    "# Read the CSV file into a pandas DataFrame\n",
    "common_surnames_df = pd.read_csv(csv_url, names=[\"Surname\", \"None\"])\n",
    "surname_list = common_surnames_df[\"Surname\"].tolist()\n",
    "print(f\"First five last names: {surname_list[:5]}\")\n",
    "\n",
    "\n",
    "# URL of the Python file with names\n",
    "python_url = \"https://gist.githubusercontent.com/ruanbekker/a1506f06aa1df06c5a9501cb393626ea/raw/cef847b6402da0fe00977e7349a4dc3fbeb4df54/array-names.py\"\n",
    "\n",
    "# Download the Python file content\n",
    "response = requests.get(python_url)\n",
    "response.raise_for_status() # Raise an exception for bad status codes\n",
    "python_content = response.text\n",
    "\n",
    "# Execute the downloaded content to get the names list\n",
    "exec(python_content)\n",
    "\n",
    "# 'names' list should now be available in the local scope\n",
    "if 'names' in locals():\n",
    "    name_list = names\n",
    "    print(\"First 5 first names:\", name_list[:5])\n",
    "else:\n",
    "    raise Exception(\"\\nCould not find 'names' variable in the downloaded Python content.\")\n",
    "\n",
    "unique_names = list(set(name_list))\n",
    "unique_surnames = list(set(surname_list))\n",
    "print(f\"Found {len(unique_names)} unique names and {len(unique_surnames)} unique surnames.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "na_P_9nHLYRW"
   },
   "source": [
    "## Items to Like"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-06T06:04:06.918172Z",
     "iopub.status.busy": "2025-09-06T06:04:06.917945Z",
     "iopub.status.idle": "2025-09-06T06:04:06.931200Z",
     "shell.execute_reply": "2025-09-06T06:04:06.930787Z",
     "shell.execute_reply.started": "2025-09-06T06:04:06.918156Z"
    },
    "id": "K0fySbJ2LYGu",
    "tags": []
   },
   "outputs": [],
   "source": [
    "items_to_like = \"\"\"\n",
    "Apricots\n",
    "Avocados\n",
    "Blackberries\n",
    "Blueberries\n",
    "Cantaloupes\n",
    "Cherries\n",
    "Coconut Flour\n",
    "Cranberries\n",
    "Dragon Fruits\n",
    "Grapefruits\n",
    "Guavas\n",
    "Honeydew Melons\n",
    "Kiwis\n",
    "Lemons\n",
    "Limes\n",
    "Lychees\n",
    "Mangoes\n",
    "Nectarines\n",
    "Papayas\n",
    "Passion Fruits\n",
    "Peaches\n",
    "Pears\n",
    "Persimmons\n",
    "Plums\n",
    "Pomegranates\n",
    "Raspberries\n",
    "Star Fruits\n",
    "Strawberries\n",
    "Watermelons\n",
    "Artichokes\n",
    "Arugula\n",
    "Asparagus\n",
    "Beets\n",
    "Broccoli\n",
    "Cabbages\n",
    "Cauliflower\n",
    "Poblano Peppers\n",
    "Ears of Corn\n",
    "Cucumbers\n",
    "Eggplants\n",
    "Garlic\n",
    "Green Beans\n",
    "Green Bell Peppers\n",
    "Habaneros\n",
    "Jalapenos\n",
    "Kale\n",
    "Leeks\n",
    "Iceberg Lettuce\n",
    "Romaine Lettuce\n",
    "Okra\n",
    "Red Onions\n",
    "Sweet Onions\n",
    "Peas\n",
    "Radishes\n",
    "Red Bell Peppers\n",
    "Shallots\n",
    "Spinach\n",
    "Butternut Squash\n",
    "Spaghetti Squash\n",
    "Sweet Potatoes\n",
    "Zucchini\n",
    "Begonias\n",
    "Black-eyed Susans\n",
    "Bleeding Hearts\n",
    "Carnations\n",
    "Chrysanthemums\n",
    "Columbines\n",
    "Coneflowers\n",
    "Daffodils\n",
    "Dahlias\n",
    "Foxgloves\n",
    "Gardenias\n",
    "Geraniums\n",
    "Gladiolus\n",
    "Hibiscus\n",
    "Hydrangeas\n",
    "Irises\n",
    "Jasmine\n",
    "Lantanas\n",
    "Lavender\n",
    "Lilies\n",
    "Marigolds\n",
    "Orchids\n",
    "Pansies\n",
    "Peonies\n",
    "Petunias\n",
    "Poppies\n",
    "Roses\n",
    "Shasta Daisies\n",
    "Snapdragons\n",
    "Sunflowers\n",
    "Tulips\n",
    "Violets\n",
    "Zinnias\n",
    "Acacia Trees\n",
    "Ash Trees\n",
    "Aspen Trees\n",
    "Banyan Trees\n",
    "Baobab Trees\n",
    "Birch Trees\n",
    "Cedar Trees\n",
    "Cherry Blossom Trees\n",
    "Cypress Trees\n",
    "Dogwood Trees\n",
    "Elm Trees\n",
    "Fir Trees\n",
    "Ginkgo Trees\n",
    "Hemlock Trees\n",
    "Holly Trees\n",
    "Jacaranda Trees\n",
    "Joshua Trees\n",
    "Juniper Trees\n",
    "Magnolia Trees\n",
    "Maple Trees\n",
    "Oak Trees\n",
    "Palm Trees\n",
    "Pine Trees\n",
    "Poplar Trees\n",
    "Redwood Trees\n",
    "Spruce Trees\n",
    "Sycamore Trees\n",
    "Willow Trees\n",
    "Tillandsia\n",
    "Aloe Vera\n",
    "Bamboo\n",
    "Basil\n",
    "Bonsai Trees\n",
    "Cacti\n",
    "Catnip\n",
    "Chives\n",
    "Cilantro\n",
    "Clover\n",
    "Dandelions\n",
    "Dill\n",
    "Ferns\n",
    "Fiddle Leaf Figs\n",
    "Ivy\n",
    "Monstera\n",
    "Moss\n",
    "Oregano\n",
    "Parsley\n",
    "Pitcher Plants\n",
    "Pothos\n",
    "Rosemary\n",
    "Sage\n",
    "Snake Plants\n",
    "Spider Plants\n",
    "Thyme\n",
    "Venus Flytraps\n",
    "Axolotls\n",
    "Betta Fish\n",
    "Canaries\n",
    "Chinchillas\n",
    "Cockatiels\n",
    "Doves\n",
    "Ferrets\n",
    "Finches\n",
    "Gerbils\n",
    "Guinea Pigs\n",
    "Guppies\n",
    "Hamsters\n",
    "Hedgehogs\n",
    "Hermit Crabs\n",
    "Bearded Dragon Lizards\n",
    "Gecko Lizards\n",
    "Macaws\n",
    "Mice\n",
    "Parakeets\n",
    "Grey Parrots\n",
    "Holland Lops\n",
    "Flemish Giants\n",
    "Pygmy Rabbits\n",
    "Rex Rabbit\n",
    "Netherland Dwarf Rabbits\n",
    "Black Scoters\n",
    "Artic Loons\n",
    "Mallards\n",
    "Blue Swedish Ducks\n",
    "Fire Ants\n",
    "Carpenter Ants\n",
    "Black Garden Ants\n",
    "Pharaoh Ants\n",
    "Argentine Ants\n",
    "Pavements Ants\n",
    "Ghost Ants\n",
    "Grease Ants\n",
    "Bulldog Bats\n",
    "Horseshoe Bats\n",
    "Old World Fruit Bats\n",
    "Big-eared Wooly Bats\n",
    "Honduran White Bats\n",
    "Carpenter Bees\n",
    "Honey Bees\n",
    "Bumblebees\n",
    "Rats\n",
    "Ball Python Snakes\n",
    "Corn Snakes\n",
    "Sugar Gliders\n",
    "Tarantulas\n",
    "Tortoises\n",
    "Alpacas\n",
    "Bison\n",
    "Donkeys\n",
    "Emus\n",
    "Goats\n",
    "Geese\n",
    "Horses\n",
    "Llamas\n",
    "Mules\n",
    "Ostriches\n",
    "Santa's Reindeer\n",
    "Sheep\n",
    "Turkeys\n",
    "Water Buffalo\n",
    "Yaks\n",
    "Alligators\n",
    "Anacondas\n",
    "Anteaters\n",
    "Armadillos\n",
    "Badgers\n",
    "Baleen\n",
    "Black Bears\n",
    "Grizzly Bears\n",
    "Panda Bears\n",
    "Polar Bears\n",
    "Beavers\n",
    "Stag Beetles\n",
    "Binturongs\n",
    "Boa Constrictors\n",
    "Bongos\n",
    "Monarch Butterflies\n",
    "Capybaras\n",
    "Caracals\n",
    "Northern Cardinals\n",
    "Centipedes\n",
    "Chameleons\n",
    "Cheetahs\n",
    "Chimpanzees\n",
    "Chipmunks\n",
    "Cicadas\n",
    "Clams\n",
    "Cobras\n",
    "Crayfish\n",
    "Crickets\n",
    "Crocodiles\n",
    "Crows\n",
    "Cuttlefish\n",
    "Damselflies\n",
    "White-tailed Deer\n",
    "Dolphins\n",
    "Dragonflies\n",
    "Eagles\n",
    "Earthworms\n",
    "Echidnas\n",
    "Elephants\n",
    "Elk\n",
    "Fennec Foxes\n",
    "Fireflies\n",
    "Flamingos\n",
    "Arctic Foxes\n",
    "Red Foxes\n",
    "Poison Dart Frogs\n",
    "Gerenuks\n",
    "Giraffes\n",
    "Gorillas\n",
    "Grasshoppers\n",
    "Hawks\n",
    "Hippopotamuses\n",
    "Hummingbirds\n",
    "Iguanas\n",
    "Jackfish\n",
    "Kangaroos\n",
    "Koalas\n",
    "Komodo Dragons\n",
    "Ladybugs\n",
    "Lemurs\n",
    "Lobsters\n",
    "Manatees\n",
    "Maned Wolves\n",
    "Markhors\n",
    "Meerkats\n",
    "Millipedes\n",
    "Moose\n",
    "Carpet Moth\n",
    "Mussels\n",
    "Nassarius\n",
    "Newts\n",
    "Ocelots\n",
    "Blue-ringed Octopus\n",
    "Okapi\n",
    "Orangutans\n",
    "River Otters\n",
    "Owls\n",
    "Oysters\n",
    "Pangolins\n",
    "Peacocks\n",
    "Pelicans\n",
    "Penguins\n",
    "Pipefish\n",
    "Platypuses\n",
    "Porcupines\n",
    "Praying Mantises\n",
    "Puffins\n",
    "Timor Pythons\n",
    "Quokkas\n",
    "Raccoons\n",
    "Rattlesnakes\n",
    "Ravens\n",
    "Red Pandas\n",
    "Rhinoceroses\n",
    "Robins\n",
    "Saiga Antelopes\n",
    "Salamanders\n",
    "Sand Dollars\n",
    "Scallops\n",
    "Scorpions\n",
    "Sea Anemones\n",
    "Sea Lions\n",
    "Sea Otters\n",
    "Sea Urchins\n",
    "Seahorses\n",
    "Seals\n",
    "Servals\n",
    "Great White Sharks\n",
    "Hammerhead Sharks\n",
    "Whale Sharks\n",
    "Giant Tiger Prawns\n",
    "Skunks\n",
    "Sloths\n",
    "Slugs\n",
    "Snails\n",
    "Snow Leopards\n",
    "Sparrows\n",
    "Bigfin Reef Squids\n",
    "Squirrels\n",
    "Starfish\n",
    "Stick Insects\n",
    "Swans\n",
    "Tapirs\n",
    "Tasmanian Devils\n",
    "Toads\n",
    "Wallabies\n",
    "Walruses\n",
    "Potter Wasps\n",
    "Blue Whales\n",
    "Humpback Whales\n",
    "Orca Whales\n",
    "Artic Wolves\n",
    "Wolverines\n",
    "Red Wolves\n",
    "Wombats\n",
    "Woodpeckers\n",
    "Zebras\n",
    "Anglerfish\n",
    "Beluga Whales\n",
    "Dumbo Octopuses\n",
    "Frilled Sharks\n",
    "Giant Isopods\n",
    "Goblin Sharks\n",
    "Horseshoe Crabs\n",
    "Manta Rays\n",
    "Mantis Shrimp\n",
    "Narwhals\n",
    "Nudibranchs\n",
    "Pistol Shrimp\n",
    "Sea Cucumbers\n",
    "Sea Pens\n",
    "Sperm Whales\n",
    "Stingrays\n",
    "Ocean Sunfish\n",
    "Vampire Squid\n",
    "Voluta\n",
    "Yeti Crabs\n",
    "Albatrosses\n",
    "Atlas Moths\n",
    "Bee-eaters\n",
    "Glasswing Butterflies\n",
    "Goliath Beetles\n",
    "Hercules Beetles\n",
    "Hoopoes\n",
    "Hornbills\n",
    "Jewel Wasps\n",
    "Kingfishers\n",
    "Luna Moths\n",
    "Lyrebirds\n",
    "Orchid Mantises\n",
    "Quetzals\n",
    "Rosy Maple Moths\n",
    "Secretarybirds\n",
    "Toucans\n",
    "Walking Leaves\n",
    "Bat Flowers\n",
    "Bird of Paradise Flowers\n",
    "Dragon's Blood Trees\n",
    "Lotus Flowers\n",
    "Passion Flowers\n",
    "Protea Flowers\n",
    "Rafflesia Flowers\n",
    "Rainbow Eucalyptus Trees\n",
    "Titan Arums\n",
    "Welwitschia Mirabilis\n",
    "Beaches\n",
    "Caves\n",
    "Clouds\n",
    "Deserts\n",
    "Forests\n",
    "Islands\n",
    "Lakes\n",
    "Moon\n",
    "Mountains\n",
    "Rain\n",
    "Rivers\n",
    "Snow\n",
    "Sun\n",
    "Sunrise\n",
    "Sunset\n",
    "X-Rays\n",
    "Volcanoes\n",
    "Waterfalls\n",
    "Wind\n",
    "Amaranth\n",
    "Bagels\n",
    "Baguettes\n",
    "Barley\n",
    "Buckwheat\n",
    "Ciabatta\n",
    "Cornmeal\n",
    "Couscous\n",
    "Crepes\n",
    "Croissants\n",
    "Millet\n",
    "English Muffins\n",
    "Oats\n",
    "Quinoa\n",
    "Brown Rice\n",
    "Turmeric\n",
    "White Rice\n",
    "Wild Rice\n",
    "Sorghum\n",
    "Spelt\n",
    "Teff\n",
    "Naan Bread\n",
    "Pita Bread\n",
    "Rye Bread\n",
    "Sourdough Bread\n",
    "Corn Tortillas\n",
    "Flour Tortillas\n",
    "Fusilli\n",
    "Penne\n",
    "Egg Noodles\n",
    "Rice Noodles\n",
    "Soba Noodles\n",
    "Udon Noodles\n",
    "Cheerios\n",
    "Corn Flakes\n",
    "Anchovies\n",
    "Bacon\n",
    "Calamari\n",
    "Catfish\n",
    "Cod\n",
    "Ground Beef\n",
    "Haddock\n",
    "Halibut\n",
    "Ham\n",
    "Lamb\n",
    "Mackerel\n",
    "Pheasant\n",
    "Pork Chops\n",
    "Pulled Pork\n",
    "Quail Meat\n",
    "Beef Ribs\n",
    "Pork Ribs\n",
    "Roast Beef\n",
    "Salmon\n",
    "Sardines\n",
    "Sausages\n",
    "Sea Bass\n",
    "Steak\n",
    "Swordfish\n",
    "Tilapia\n",
    "Trout\n",
    "Venison\n",
    "Baked Potatoes\n",
    "Bibimbap\n",
    "Burritos\n",
    "Ceviche\n",
    "Chili\n",
    "Coleslaw\n",
    "Curries\n",
    "Dumplings\n",
    "Eggs Benedict\n",
    "Falafel\n",
    "Fettuccine Alfredo\n",
    "Fish and Chips\n",
    "French Fries\n",
    "French Toast\n",
    "Fried Chicken\n",
    "Fried Eggs\n",
    "Goulash\n",
    "Gravy\n",
    "Grilled Cheese Sandwiches\n",
    "Guacamole\n",
    "Hamburgers\n",
    "Hot Dogs\n",
    "Hummus\n",
    "Kabobs\n",
    "Kimchi\n",
    "Lasagna\n",
    "Macaroni and Cheese\n",
    "Mashed Potatoes\n",
    "Meatloaf\n",
    "Moussaka\n",
    "Omelettes\n",
    "Onion Rings\n",
    "Pad Thai\n",
    "Paella\n",
    "Pancakes\n",
    "Pesto\n",
    "Pho\n",
    "Pepperoni Pizzas\n",
    "Hawaiian Pizzas\n",
    "Vegan Cheese Pizza\n",
    "Meat Lovers Pizza\n",
    "Deep Dish Pizza\n",
    "Poached Eggs\n",
    "Poke Bowls\n",
    "Pot Pies\n",
    "Quiches\n",
    "Ramen\n",
    "Risotto\n",
    "Roasted Vegetables\n",
    "Salsa Dip\n",
    "Samosas\n",
    "Scrambled Eggs\n",
    "Shepherd's Pies\n",
    "Spaghetti Bolognese\n",
    "Spring Rolls\n",
    "Steamed Vegetables\n",
    "Stir-fries\n",
    "Sushi\n",
    "Tacos\n",
    "Tandoori Chicken\n",
    "Waffles\n",
    "Chicken Salads\n",
    "Egg Salads\n",
    "Potato Salads\n",
    "Tuna Salads\n",
    "Americanos\n",
    "Apple Cider\n",
    "Bubble Tea\n",
    "Cappuccinos\n",
    "Eggnog\n",
    "Espresso\n",
    "Horchata\n",
    "Hot Chocolate\n",
    "Iced Coffee\n",
    "Kombucha\n",
    "Macchiatos\n",
    "Matcha Lattes\n",
    "Mochas\n",
    "Smoothies\n",
    "Sparkling Water\n",
    "Tonic Water\n",
    "Almond Milk\n",
    "Coconut Milk\n",
    "Oat Milk\n",
    "Soy Milk\n",
    "Apple Juice\n",
    "Lemonade\n",
    "Limeade\n",
    "Orange Juice\n",
    "Pineapple Juice\n",
    "Tomato Juice\n",
    "Cola Soda\n",
    "Ginger Ale Soda\n",
    "Grape Soda\n",
    "Orange Soda\n",
    "Root Beer Soda\n",
    "Black Tea\n",
    "Chai Tea\n",
    "Green Tea\n",
    "Herbal Tea\n",
    "Iced Tea\n",
    "Oolong Tea\n",
    "White Tea\n",
    "Agave Nectar\n",
    "Allspice\n",
    "Baking Powder\n",
    "Baking Soda\n",
    "Barbecue Sauce\n",
    "Bay Leaves\n",
    "Black Beans\n",
    "Butter\n",
    "Cardamom\n",
    "Cashews\n",
    "Cayenne Pepper\n",
    "Cocoa Powder\n",
    "Coriander\n",
    "Cornstarch\n",
    "Cumin\n",
    "Food Coloring\n",
    "All-Purpose Flour\n",
    "Garbanzo Beans\n",
    "Gelatin\n",
    "Ghee\n",
    "Honey\n",
    "Hot Sauce\n",
    "Ketchup\n",
    "Kidney Beans\n",
    "Lard\n",
    "Lentils\n",
    "Macadamia Nuts\n",
    "Maple Syrup\n",
    "Margarine\n",
    "Mayonnaise\n",
    "Prepared Mustard\n",
    "Nutmeg\n",
    "Pecans\n",
    "Black Pepper\n",
    "Pinto Beans\n",
    "Akbari Pistachios\n",
    "Salt\n",
    "Seitan\n",
    "Soy Sauce\n",
    "Star Anise\n",
    "Brown Sugar\n",
    "Powdered Sugar\n",
    "White Sugar\n",
    "Tempeh\n",
    "Tofu\n",
    "Walnuts\n",
    "Worcestershire Sauce\n",
    "Yeast\n",
    "Canola Oil\n",
    "Olive Oil\n",
    "Sesame Oil\n",
    "Vegetable Oil\n",
    "Flax Seeds\n",
    "Pumpkin Seeds\n",
    "Sesame Seeds\n",
    "Apple Cider Vinegar\n",
    "Balsamic Vinegar\n",
    "Red Wine Vinegar\n",
    "White Vinegar\n",
    "Cloves\n",
    "Hazelnut Flavor\n",
    "Vanilla\n",
    "Affogatos\n",
    "Alfajores\n",
    "Ambrosia Salads\n",
    "Animal Crackers\n",
    "Apple Slices\n",
    "Baklava\n",
    "Banana Chips\n",
    "Banana Splits\n",
    "Beef Jerky\n",
    "Beignets\n",
    "Biscotti\n",
    "White Chocolate Brownies\n",
    "Cannoli\n",
    "Caramel deLites\n",
    "Celery with peanut butter\n",
    "Cheesecake\n",
    "Chips Ahoy!\n",
    "Churros\n",
    "Cinnamon Rolls\n",
    "Clafoutis\n",
    "Cobblers\n",
    "Cosmic Brownies\n",
    "Cottage Cheese\n",
    "Club Crackers\n",
    "Cream Puffs\n",
    "Creme Brulee\n",
    "Crumbles\n",
    "Custard\n",
    "Deviled Eggs\n",
    "Ding Dongs\n",
    "Dippin' Dots\n",
    "Donuts\n",
    "Eclairs\n",
    "Edamame\n",
    "Energy Balls\n",
    "Financiers\n",
    "Flan\n",
    "Root Beer Floats\n",
    "Frosting\n",
    "Fruit Snacks\n",
    "Funnel Cakes\n",
    "Gelato\n",
    "Gingerbread\n",
    "Goldfish Crackers\n",
    "Graham Crackers\n",
    "Granola Bars\n",
    "Halva\n",
    "Ho Hos\n",
    "Hot Fudge\n",
    "Ice Cream Cones\n",
    "Ice Cream Sandwiches\n",
    "Ice Cream Sundaes\n",
    "Italian Ice\n",
    "Jello\n",
    "Jelly\n",
    "Linzer Tortes\n",
    "Coconut Macaroons\n",
    "Macarons\n",
    "Madeleines\n",
    "Malts\n",
    "Marmalade\n",
    "Marzipan\n",
    "Milanos\n",
    "Milkshakes\n",
    "Mochi\n",
    "Moon Pies\n",
    "Mousse\n",
    "Sweet Muffins\n",
    "Nougat\n",
    "Nutty Buddies\n",
    "Nutter Butters\n",
    "Olives\n",
    "Oreos\n",
    "Panna Cotta\n",
    "Parfaits\n",
    "Pickles\n",
    "Pita Chips\n",
    "Popcorn\n",
    "Popsicles\n",
    "Potato Chips\n",
    "Pretzels\n",
    "Protein Bars\n",
    "Rice Cakes\n",
    "Rice Krispie Treats\n",
    "Scones\n",
    "Seaweed Snacks\n",
    "Shaved Ice\n",
    "Shortbread\n",
    "Slushies\n",
    "Sorbet\n",
    "Souffles\n",
    "Sprinkles\n",
    "Strudels\n",
    "Swiss Rolls\n",
    "Tagalongs\n",
    "Tarts\n",
    "Thin Mints\n",
    "Tiramisu\n",
    "Tortilla Chips\n",
    "Trail Mix\n",
    "Trifles\n",
    "Turkish Delight\n",
    "Turnovers\n",
    "Twinkies\n",
    "Veggie Straws\n",
    "Whipped Cream\n",
    "Whoopie Pies\n",
    "Coconut Yogurt\n",
    "Zebra Cakes\n",
    "Angel Food Cakes\n",
    "Black Forest Cakes\n",
    "Bundt Cakes\n",
    "Carrot Cakes\n",
    "Coffee Cakes\n",
    "Fruitcakes\n",
    "Icebox Cakes\n",
    "Layer Cakes\n",
    "Pound Cakes\n",
    "Red Velvet Cakes\n",
    "Sheet Cakes\n",
    "Sponge Cakes\n",
    "Upside-Down Cakes\n",
    "Candy Canes\n",
    "Caramel Candies\n",
    "Cotton Candy\n",
    "Jelly Beans\n",
    "Licorice\n",
    "Lollipops\n",
    "Marshmallows\n",
    "Toffee\n",
    "Truffles\n",
    "Dark Chocolate\n",
    "Milk Chocolate\n",
    "Chewing Gum\n",
    "Apple Pies\n",
    "Key Lime Pies\n",
    "Oatmeal Creme Pies\n",
    "Pecan Pies\n",
    "Pumpkin Pies\n",
    "Bread Puddings\n",
    "Chia Seed Puddings\n",
    "Rice Puddings\n",
    "Tapioca Puddings\n",
    "Caramel Sauce\n",
    "Chocolate Chip Cookies\n",
    "Oatmeal Raisin Cookies\n",
    "Sugar Cookies\n",
    "Frozen Yogurt\n",
    "Asafoetida\n",
    "Caraway\n",
    "Celery Seed\n",
    "Chervil\n",
    "Chinese Five Spice\n",
    "Fennel\n",
    "Fenugreek\n",
    "Garam Masala\n",
    "Herbes de Provence\n",
    "Juniper Berries\n",
    "Mace\n",
    "Marjoram\n",
    "Mustard Seed\n",
    "Green Peppercorns\n",
    "Pink Peppercorns\n",
    "Sichuan Peppercorns\n",
    "White Pepper\n",
    "Poppy Seed\n",
    "Saffron\n",
    "Smoked Paprika\n",
    "Sumac\n",
    "Za'atar\n",
    "Arepas\n",
    "Bammy\n",
    "Blue Cheese\n",
    "Brie\n",
    "Brioche\n",
    "Camembert\n",
    "Challah\n",
    "Cornbread\n",
    "Feta Cheese\n",
    "Focaccia\n",
    "Goat Cheese\n",
    "Gouda\n",
    "Halloumi\n",
    "Havarti\n",
    "Injera\n",
    "Lavash\n",
    "Manchego\n",
    "Mascarpone\n",
    "Muenster\n",
    "Multigrain Bread\n",
    "Paneer\n",
    "Potato Bread\n",
    "Provolone\n",
    "Ricotta\n",
    "Acrobatics\n",
    "Aerobics\n",
    "Aerial Silks\n",
    "Archery\n",
    "Backpacking\n",
    "Badminton\n",
    "Barre\n",
    "Basketball\n",
    "Billiards\n",
    "BMX Biking\n",
    "Bocce Ball\n",
    "Bodyboarding\n",
    "Bowling\n",
    "Boxing\n",
    "Calisthenics\n",
    "Canoeing\n",
    "Cheerleading\n",
    "Cricket\n",
    "Croquet\n",
    "CrossFit\n",
    "Curling\n",
    "Darts\n",
    "Disc Golf\n",
    "Equestrianism\n",
    "Fencing\n",
    "Fishing\n",
    "Freediving\n",
    "Ultimate Frisbee\n",
    "Handball\n",
    "Field Hockey\n",
    "Ice Hockey\n",
    "Jet Skiing\n",
    "Judo\n",
    "Karate\n",
    "Kayaking\n",
    "Kickboxing\n",
    "Kitesurfing\n",
    "Lacrosse\n",
    "Marathon Running\n",
    "Obstacle Course Racing\n",
    "Parkour\n",
    "Pilates\n",
    "Power Walking\n",
    "Rock Climbing\n",
    "Roller Skating\n",
    "Rowing\n",
    "Rugby\n",
    "Sailing\n",
    "Scootering\n",
    "Scuba Diving\n",
    "Marksmanship\n",
    "Shuffleboard\n",
    "Skimboarding\n",
    "Snorkeling\n",
    "Snowboarding\n",
    "Snowshoeing\n",
    "Soccer\n",
    "Softball\n",
    "Spinning\n",
    "Stair Climbing\n",
    "Stand-up Paddleboarding\n",
    "Lap Swimming\n",
    "Synchronized Swimming\n",
    "Table Tennis\n",
    "Tae Kwon Do\n",
    "Tai Chi\n",
    "Tobogganing\n",
    "Trail Running\n",
    "Trampolining\n",
    "Triathlons\n",
    "Tumbling\n",
    "Volleyball\n",
    "Wakeboarding\n",
    "Water Polo\n",
    "Water Skiing\n",
    "Weightlifting\n",
    "Windsurfing\n",
    "Wrestling\n",
    "Yoga\n",
    "Zumba\n",
    "Ballroom Dancing\n",
    "Hip Hop Dancing\n",
    "Pole Dancing\n",
    "Salsa Dancing\n",
    "Swing Dancing\n",
    "Tango Dancing\n",
    "Tap Dancing\n",
    "Figure Skating\n",
    "Speed Skating\n",
    "Mountain Biking\n",
    "Road Cycling\n",
    "Track Cycling\n",
    "Cross-country Skiing\n",
    "Inline Skating\n",
    "Longboarding\n",
    "Apples to Apples\n",
    "Arcade Games\n",
    "Backgammon\n",
    "Bananagrams\n",
    "Battleship\n",
    "Bingo\n",
    "Bridge\n",
    "Canasta\n",
    "Carcassonne\n",
    "Cards Against Humanity\n",
    "Catan\n",
    "Charades\n",
    "Checkers\n",
    "Chess\n",
    "Clue\n",
    "Codenames\n",
    "Connect Four\n",
    "Cribbage\n",
    "Dominoes\n",
    "Dungeons & Dragons\n",
    "Escape Rooms\n",
    "Euchre\n",
    "Exploding Kittens\n",
    "The Game of Life\n",
    "Gin Rummy\n",
    "Go\n",
    "Hearts\n",
    "Jenga\n",
    "Juggling\n",
    "Kite Flying\n",
    "LARPing\n",
    "Lotteries\n",
    "Magic: The Gathering\n",
    "Mahjong\n",
    "Mazes\n",
    "Monopoly\n",
    "Pandemic\n",
    "Phase 10\n",
    "Pictionary\n",
    "Pinball\n",
    "Poker\n",
    "Riddles\n",
    "Risk\n",
    "Rubik's Cubes\n",
    "Scrabble\n",
    "Secret Hitler\n",
    "Skip-Bo\n",
    "Solitaire\n",
    "Spades\n",
    "Telestrations\n",
    "Ticket to Ride\n",
    "Trivia\n",
    "Twister\n",
    "Uno\n",
    "Warhammer 40\n",
    "Werewolf\n",
    "Word Searches\n",
    "Yahtzee\n",
    "Yo-yos\n",
    "Crossword Puzzles\n",
    "Jigsaw Puzzles\n",
    "Sudoku Puzzles\n",
    "Action Video Games\n",
    "Adventure Video Games\n",
    "Platformer Video Games\n",
    "Puzzle Video Games\n",
    "Racing Video Games\n",
    "Role-Playing Video Games\n",
    "Sandbox Video Games\n",
    "Simulation Video Games\n",
    "Sports Video Games\n",
    "Strategy Video Games\n",
    "Antiquing\n",
    "Architecture\n",
    "Astrophotography\n",
    "Batik\n",
    "Beatboxing\n",
    "Birdwatching\n",
    "Block Printing\n",
    "Blogging\n",
    "Bookbinding\n",
    "Candle Making\n",
    "Card Making\n",
    "Collage\n",
    "Composing Music\n",
    "Cosplay\n",
    "Crocheting\n",
    "Cross-stitching\n",
    "Digital Art\n",
    "DJing\n",
    "Embroidery\n",
    "Etching\n",
    "Fashion Design\n",
    "Filmmaking\n",
    "Flower Arranging\n",
    "Game Design\n",
    "Genealogy\n",
    "Geocaching\n",
    "Glassblowing\n",
    "Graffiti Art\n",
    "Graphic Design\n",
    "Homebrewing\n",
    "Improvisational Theater\n",
    "Interior Design\n",
    "Knitting\n",
    "Landscaping\n",
    "Learning a New Language\n",
    "Leatherworking\n",
    "Lithography\n",
    "Macrame\n",
    "Magic Tricks\n",
    "Mentoring\n",
    "Metalworking\n",
    "Mixology\n",
    "Model Building\n",
    "Mosaic\n",
    "Mural Painting\n",
    "Music Production\n",
    "Nail Art\n",
    "Origami\n",
    "Acrylic Painting\n",
    "Oil Painting\n",
    "Watercolor Painting\n",
    "Papier-mache\n",
    "Playwriting\n",
    "Poetry Slams\n",
    "Podcasting\n",
    "Pottery\n",
    "Puppetry\n",
    "Reading\n",
    "Screen Printing\n",
    "Screenwriting\n",
    "Scrapbooking\n",
    "Sculpting\n",
    "Sewing\n",
    "Singing\n",
    "Sketching\n",
    "Soap Making\n",
    "Songwriting\n",
    "Stained Glass\n",
    "Stand-up Comedy\n",
    "Stargazing\n",
    "Storytelling\n",
    "Streaming\n",
    "3D Modeling\n",
    "Thrifting\n",
    "Tie-dye\n",
    "Traveling\n",
    "Turntablism\n",
    "Tutoring\n",
    "Urban Exploration\n",
    "Ventriloquism\n",
    "Videography\n",
    "Vlogging\n",
    "Volunteering\n",
    "Weaving\n",
    "Wood Carving\n",
    "Wood Burning\n",
    "Poetry Writing\n",
    "Architectural Photography\n",
    "Fashion Photography\n",
    "Food Photography\n",
    "Landscape Photography\n",
    "Macro Photography\n",
    "Photojournalism\n",
    "Portrait Photography\n",
    "Street Photography\n",
    "East Asian Calligraphy\n",
    "Western Calligraphy\n",
    "Beachcombing\n",
    "Mason Bees\n",
    "Building Sandcastles\n",
    "Building Snowmen\n",
    "Bushcraft\n",
    "Cloud Watching\n",
    "Composting\n",
    "Flying Drones\n",
    "Foraging\n",
    "Fossil Hunting\n",
    "Having a snowball fight\n",
    "Herbalism\n",
    "Homesteading\n",
    "Knot Tying\n",
    "Leaf Peeping\n",
    "Magnet Fishing\n",
    "Making Snow Angels\n",
    "Metal Detecting\n",
    "Mushroom Hunting\n",
    "Nature Journaling\n",
    "Picnicking\n",
    "Rock Balancing\n",
    "Rock Collecting\n",
    "Sunbathing\n",
    "Visiting Aquariums\n",
    "Visiting Botanical Gardens\n",
    "Visiting National Parks\n",
    "Visiting Zoos\n",
    "Whittling\n",
    "Agriculture Science\n",
    "Anthropology\n",
    "Archaeology\n",
    "Art History\n",
    "Astronomy\n",
    "Botany\n",
    "Cartography\n",
    "Chemistry\n",
    "Classics\n",
    "Cognitive Science\n",
    "Computer Science\n",
    "Criminology\n",
    "Economics\n",
    "Education\n",
    "Environmental Science\n",
    "Ethics\n",
    "Forestry\n",
    "Genetics\n",
    "Geography\n",
    "Geology\n",
    "Immunology\n",
    "International Relations\n",
    "Law\n",
    "Marine Biology\n",
    "Mathematics\n",
    "Meteorology\n",
    "Microbiology\n",
    "Music Theory\n",
    "Neuroscience\n",
    "Oceanography\n",
    "Paleontology\n",
    "Performing Arts Studies\n",
    "Pharmacology\n",
    "Philosophy\n",
    "Physics\n",
    "Political Science\n",
    "Psychology\n",
    "Public Health\n",
    "Robotics\n",
    "Social Work\n",
    "Sociology\n",
    "Statistics\n",
    "Theology\n",
    "Toxicology\n",
    "Urban Studies\n",
    "Zoology\n",
    "Aerospace Engineering\n",
    "Biomedical Engineering\n",
    "Chemical Engineering\n",
    "Civil Engineering\n",
    "Electrical Engineering\n",
    "Environmental Engineering\n",
    "Mechanical Engineering\n",
    "Action Movies\n",
    "Adventure Movies\n",
    "Animated Movies\n",
    "Autobiographies\n",
    "Biographies\n",
    "Children's Literature\n",
    "Comedy Literature\n",
    "Comedy Movies\n",
    "Cooking Shows\n",
    "Documentary Films\n",
    "Documentary Series\n",
    "Drama Literature\n",
    "Drama Movies\n",
    "Dystopian Fiction\n",
    "Essays\n",
    "Fables\n",
    "Fairy Tales\n",
    "Family Movies\n",
    "Fantasy Literature\n",
    "Fantasy Movies\n",
    "Folklore\n",
    "Game Shows\n",
    "Historical Fiction\n",
    "Horror Literature\n",
    "Horror Movies\n",
    "Legal Dramas\n",
    "Legends\n",
    "Medical Dramas\n",
    "Memoirs\n",
    "Musicals\n",
    "Mystery Literature\n",
    "Mythology\n",
    "Police Procedurals\n",
    "Reality Competitions\n",
    "Romance Literature\n",
    "Satire\n",
    "Sci-Fi Movies\n",
    "Science Fiction Literature\n",
    "Sitcoms\n",
    "Talk Shows\n",
    "Thriller Literature\n",
    "Thriller Movies\n",
    "Tragedy Literature\n",
    "Travelogues\n",
    "True Crime\n",
    "Western Movies\n",
    "Young Adult Fiction\n",
    "A cappella music\n",
    "Abstract Expressionism\n",
    "Alternative Rock\n",
    "Ambient Music\n",
    "Art Deco\n",
    "Art Nouveau\n",
    "Barbershop quartets\n",
    "Baroque Art\n",
    "Baroque Music\n",
    "Bluegrass Music\n",
    "Blues Music\n",
    "Byzantine Art\n",
    "Conceptual Art\n",
    "Concertos\n",
    "Country Music\n",
    "Cubism\n",
    "Dadaism\n",
    "Disco Music\n",
    "Electronic Music\n",
    "Fauvism\n",
    "Film scores\n",
    "Folk Music\n",
    "Fugues\n",
    "Funk Music\n",
    "Futurism\n",
    "Gospel Music\n",
    "Gothic Art\n",
    "Gregorian chants\n",
    "Heavy Metal Music\n",
    "Hip Hop Music\n",
    "House Music\n",
    "Impressionism\n",
    "Indie Music\n",
    "Industrial music\n",
    "Lo-fi music\n",
    "Madrigals\n",
    "Minimalism\n",
    "Minimalist music\n",
    "Neoclassicism\n",
    "New-age music\n",
    "Opera\n",
    "Photorealism\n",
    "Pointillism\n",
    "Pop Art\n",
    "Pop Music\n",
    "Post-Impressionism\n",
    "Punk Rock\n",
    "R&B Music\n",
    "Reggae Music\n",
    "Renaissance Art\n",
    "Rococo Art\n",
    "Romantic Music\n",
    "Romanticism\n",
    "Sea shanties\n",
    "Sonatas\n",
    "Soul Music\n",
    "Surrealism\n",
    "Symphonies\n",
    "Techno Music\n",
    "Vaporwave\n",
    "Video game music\n",
    "World music\n",
    "The Age of Discovery\n",
    "The Age of Enlightenment\n",
    "Ancient Egypt\n",
    "Ancient Greece\n",
    "The Aztec Empire\n",
    "The Belle Epoque\n",
    "The Bronze Age\n",
    "The Counterculture of the 1960s\n",
    "The Digital Age\n",
    "Early Modern Period\n",
    "The Elizabethan Era\n",
    "Feudal Japan\n",
    "The Gilded Age\n",
    "The Golden Age of Piracy\n",
    "The Hanseatic League\n",
    "The Inca Empire\n",
    "The Industrial Revolution\n",
    "The Information Age\n",
    "The Iron Age\n",
    "Late Antiquity\n",
    "The Mayan Civilization\n",
    "The Ming Dynasty\n",
    "The Ottoman Empire\n",
    "Post-War Boom\n",
    "Prehistory\n",
    "The Progressive Era\n",
    "The Regency Era\n",
    "The Roaring Twenties\n",
    "The Roman Empire\n",
    "The Silk Road\n",
    "The Space Age\n",
    "The Stone Age\n",
    "The Victorian Era\n",
    "The Viking Age\n",
    "The Wild West\n",
    "Balconies\n",
    "Bath Mats\n",
    "Batteries\n",
    "Beds\n",
    "Bed Sheets\n",
    "Binders\n",
    "Blankets\n",
    "Blinds\n",
    "Bookshelves\n",
    "Brooms\n",
    "Buckets\n",
    "Candle Holders\n",
    "Chairs\n",
    "Clocks\n",
    "Coasters\n",
    "Coffee Tables\n",
    "Bedroom Curtains\n",
    "Desks\n",
    "Dishwashers\n",
    "Doors\n",
    "Dressers\n",
    "Dryers\n",
    "Dustpans\n",
    "Duvets\n",
    "Elevators\n",
    "Envelopes\n",
    "Extension Cords\n",
    "Fireplaces\n",
    "Folders\n",
    "Hangers\n",
    "Highlighters\n",
    "Clothing Irons\n",
    "Ironing Boards\n",
    "Keys\n",
    "Lamps\n",
    "Laundry Baskets\n",
    "Lightbulbs\n",
    "Microwaves\n",
    "Mirrors\n",
    "Mops\n",
    "Napkins\n",
    "Nightstands\n",
    "Notebooks\n",
    "Ovens\n",
    "Paper\n",
    "Paper Clips\n",
    "Patios\n",
    "Pencils\n",
    "Pens\n",
    "Picture Frames\n",
    "Pillows\n",
    "Placemats\n",
    "Post-it Notes\n",
    "Printers\n",
    "Quilts\n",
    "Refrigerators\n",
    "Remote Controls\n",
    "Routers\n",
    "Rugs\n",
    "Scissors\n",
    "Shower Curtains\n",
    "Smartphones\n",
    "Soap Dishes\n",
    "Speakers\n",
    "Sponges\n",
    "Stairs\n",
    "Staplers\n",
    "Stoves\n",
    "Tablecloths\n",
    "Dining Tables\n",
    "Tablets\n",
    "Tape Dispensers\n",
    "Televisions\n",
    "Toothbrushes\n",
    "Towels\n",
    "Trash Cans\n",
    "Vacuum Cleaners\n",
    "Vases\n",
    "Wardrobes\n",
    "Washing Machines\n",
    "Windows\n",
    "Backpacks\n",
    "Beanies\n",
    "Belts\n",
    "Boots\n",
    "Bow Ties\n",
    "Bracelets\n",
    "Button-down Shirts\n",
    "Caps\n",
    "Dresses\n",
    "Earrings\n",
    "Eyeglasses\n",
    "Handbags\n",
    "Hoodies\n",
    "Jackets\n",
    "Jeans\n",
    "Jumpsuits\n",
    "Leggings\n",
    "Mittens\n",
    "Necklaces\n",
    "Overalls\n",
    "Pajamas\n",
    "Pocket Watches\n",
    "Polo Shirts\n",
    "Raincoats\n",
    "Rings\n",
    "Robes\n",
    "Sandals\n",
    "Scarves\n",
    "Shorts\n",
    "Skirts\n",
    "Slippers\n",
    "Sneakers\n",
    "Socks\n",
    "Suits\n",
    "Sunglasses\n",
    "Sweaters\n",
    "Swimsuits\n",
    "T-shirts\n",
    "Ties\n",
    "Tights\n",
    "Tuxedos\n",
    "Umbrellas\n",
    "Vests\n",
    "Wallets\n",
    "Watches\n",
    "Abacuses\n",
    "Air Compressors\n",
    "Axes\n",
    "Binoculars\n",
    "Caulking Guns\n",
    "Chainsaws\n",
    "Clamps\n",
    "Compasses\n",
    "Drills\n",
    "Duct Tape\n",
    "Fire Extinguishers\n",
    "Flashlights\n",
    "Garden Hoses\n",
    "Hammers\n",
    "Ladders\n",
    "Lawn Mowers\n",
    "Leaf Blowers\n",
    "Levels\n",
    "Magnifying Glasses\n",
    "Mallets\n",
    "Microscopes\n",
    "Multimeters\n",
    "Paint Rollers\n",
    "Paintbrushes\n",
    "Pliers\n",
    "Pressure Washers\n",
    "Pruning Shears\n",
    "Putty Knives\n",
    "Rakes\n",
    "Safety Goggles\n",
    "Sanders\n",
    "Hack Saws\n",
    "Screwdrivers\n",
    "Shovels\n",
    "Slide Rules\n",
    "Smoke Detectors\n",
    "Soldering Irons\n",
    "Stud Finders\n",
    "Tape Measures\n",
    "Telescopes\n",
    "Toolboxes\n",
    "Trowels\n",
    "Utility Knives\n",
    "Vises\n",
    "Watering Cans\n",
    "Wheelbarrows\n",
    "Work Gloves\n",
    "Workbenches\n",
    "Wrenches\n",
    "Zip Ties\n",
    "Accordions\n",
    "Acoustic Guitars\n",
    "Amplifiers\n",
    "Bagpipes\n",
    "Banjos\n",
    "Bass Guitars\n",
    "Bassoons\n",
    "Bongo Drums\n",
    "CD Players\n",
    "Cassette Players\n",
    "Cellos\n",
    "Clarinets\n",
    "Conga Drums\n",
    "Cowbells\n",
    "Cymbals\n",
    "Didgeridoos\n",
    "Djembes\n",
    "Double Basses\n",
    "Drum Kits\n",
    "Electric Guitars\n",
    "Electronic Keyboards\n",
    "Flutes\n",
    "French Horns\n",
    "Glockenspiels\n",
    "Harmonicas\n",
    "Harps\n",
    "MP3 Players\n",
    "Mandolins\n",
    "Maracas\n",
    "Metronomes\n",
    "Oboes\n",
    "Pianos\n",
    "Pipe Organs\n",
    "Radios\n",
    "Recorders\n",
    "Record Players\n",
    "Saxophones\n",
    "Sitars\n",
    "Synthesizers\n",
    "Tambourines\n",
    "Trombones\n",
    "Trumpets\n",
    "Tubas\n",
    "Tuning Forks\n",
    "Triangles\n",
    "Ukuleles\n",
    "Vibraphones\n",
    "Violas\n",
    "Violins\n",
    "Xylophones\n",
    "Affection\n",
    "Amusement\n",
    "Autonomy\n",
    "Belonging\n",
    "Calmness\n",
    "Closure\n",
    "Collaboration\n",
    "Community\n",
    "Compassion\n",
    "Confidence\n",
    "Contentment\n",
    "Courage\n",
    "Creativity\n",
    "Curiosity\n",
    "Delight\n",
    "Empathy\n",
    "Enthusiasm\n",
    "Euphoria\n",
    "Excitement\n",
    "Fika\n",
    "Forgiveness\n",
    "Friendship\n",
    "Frisson\n",
    "Generosity\n",
    "Gratitude\n",
    "Growth\n",
    "Honesty\n",
    "Hope\n",
    "Humility\n",
    "Humor\n",
    "Hygge\n",
    "Ikigai\n",
    "Inspiration\n",
    "Integrity\n",
    "Interest\n",
    "Kindness\n",
    "Legacy\n",
    "Love\n",
    "Loyalty\n",
    "Mastery\n",
    "Optimism\n",
    "Patience\n",
    "Perseverance\n",
    "Playfulness\n",
    "Pride\n",
    "Purpose\n",
    "Relief\n",
    "Respect\n",
    "Responsibility\n",
    "Reverence\n",
    "Satisfaction\n",
    "Spontaneity\n",
    "Teamwork\n",
    "Triumph\n",
    "Vindication\n",
    "Wabi-sabi\n",
    "Wisdom\n",
    "Wonder\n",
    "Asymmetry\n",
    "Catharsis\n",
    "Cool Breezes\n",
    "Daydreaming\n",
    "Déjà vu\n",
    "Epiphanies\n",
    "Flow State\n",
    "Fluffy Clouds\n",
    "Focus\n",
    "Glistening Dewdrops\n",
    "Imagination\n",
    "Intuition\n",
    "Lucid Dreaming\n",
    "Meditation\n",
    "Mental Clarity\n",
    "Mindfulness\n",
    "Nostalgia\n",
    "Organization\n",
    "Patterns\n",
    "Rainbows\n",
    "Relaxation\n",
    "Serendipity\n",
    "Solitude\n",
    "Symmetry\n",
    "Synchronicity\n",
    "The Feeling of a Fluffy Blanket\n",
    "The Feeling of a Smooth Stone\n",
    "The Feeling of Cool Water\n",
    "The Feeling of Soft Grass\n",
    "The Feeling of Warm Sand\n",
    "The Quiet of a Forest\n",
    "The Scent of a Campfire\n",
    "The Scent of Baking Bread\n",
    "The Scent of Flowers\n",
    "The Scent of Pine Needles\n",
    "The Smell of Fresh-Cut Grass\n",
    "The Smell of Rain\n",
    "The Sound of a Babbling Brook\n",
    "The Sound of a Crackling Fire\n",
    "The Sound of Birdsong\n",
    "The Sound of Crickets Chirping\n",
    "The Sound of Ocean Waves\n",
    "The Sound of Wind in the Trees\n",
    "The Andromeda Galaxy\n",
    "Asteroids\n",
    "Auroras\n",
    "The Big Dipper\n",
    "Black Holes\n",
    "Comets\n",
    "Earth\n",
    "Black Eye Galaxy\n",
    "Jupiter\n",
    "Lunar Eclipses\n",
    "Mars\n",
    "Mercury\n",
    "Meteors\n",
    "The Milky Way Galaxy\n",
    "Nebulae\n",
    "Neptune\n",
    "Planetary Rings\n",
    "Pluto\n",
    "Pulsars\n",
    "Quasars\n",
    "Mimas\n",
    "Solar Eclipses\n",
    "Star Clusters\n",
    "Supernovae\n",
    "Uranus\n",
    "Venus\n",
    "Atolls\n",
    "Basins\n",
    "Buttes\n",
    "Cliffs\n",
    "Continental Shelves\n",
    "Coral Reefs\n",
    "Dunes\n",
    "Fjords\n",
    "Fossils\n",
    "Geysers\n",
    "Glaciers\n",
    "Gorges\n",
    "Hills\n",
    "Hot Springs\n",
    "Icebergs\n",
    "Isthmuses\n",
    "Lagoons\n",
    "Mangrove Forests\n",
    "Marshes\n",
    "Mesas\n",
    "Natural Arches\n",
    "Oceanic Trenches\n",
    "Peninsulas\n",
    "Plains\n",
    "Plateaus\n",
    "Ravines\n",
    "River Deltas\n",
    "Savannas\n",
    "Stalagmites\n",
    "Stalactites\n",
    "Steppes\n",
    "Swamps\n",
    "Taiga\n",
    "Tectonic Plates\n",
    "Tundra\n",
    "Valleys\n",
    "Agate\n",
    "Amethyst\n",
    "Aquamarine\n",
    "Citrine\n",
    "Copper\n",
    "Diamonds\n",
    "Emeralds\n",
    "Garnets\n",
    "Gold\n",
    "Hematite\n",
    "Iron\n",
    "Jade\n",
    "Jasper\n",
    "Lapis Lazuli\n",
    "Malachite\n",
    "Moonstone\n",
    "Obsidian\n",
    "Opals\n",
    "Peridot\n",
    "Pyrite\n",
    "Steel\n",
    "Milky Quartz\n",
    "Rose Quartz\n",
    "Rubies\n",
    "Sapphires\n",
    "Silver\n",
    "Sunstone\n",
    "Tiger's Eye\n",
    "Topaz\n",
    "Tourmaline\n",
    "Turquoise\n",
    "Accountants\n",
    "Actors\n",
    "Architects\n",
    "Astronauts\n",
    "Authors\n",
    "Bakers\n",
    "Barbers\n",
    "Bartenders\n",
    "Blacksmiths\n",
    "Butchers\n",
    "Carpenters\n",
    "Chefs\n",
    "Chemists\n",
    "Cleaners\n",
    "Coaches\n",
    "Dancers\n",
    "Dentists\n",
    "Detectives\n",
    "Doctors\n",
    "Drivers\n",
    "Economists\n",
    "Editors\n",
    "Electricians\n",
    "Farmers\n",
    "Firefighters\n",
    "Fishers\n",
    "Florists\n",
    "Geologists\n",
    "Hairdressers\n",
    "Historians\n",
    "Janitors\n",
    "Journalists\n",
    "Judges\n",
    "Lawyers\n",
    "Librarians\n",
    "Lifeguards\n",
    "Linguists\n",
    "Machinists\n",
    "Mail Carriers\n",
    "Mathematicians\n",
    "Mechanics\n",
    "Musicians\n",
    "Nurses\n",
    "Painters\n",
    "Pilots\n",
    "Plumbers\n",
    "Paramedics\n",
    "Tailors\n",
    "Teachers\n",
    "Software Developers\n",
    "Actuaries\n",
    "Paleontologists\n",
    "Welders\n",
    "Paralegals\n",
    "Animators\n",
    "the Arizona Diamondbacks\n",
    "the Atlanta Braves\n",
    "the Baltimore Orioles\n",
    "the Boston Red Sox\n",
    "the Chicago Cubs\n",
    "the Chicago White Sox\n",
    "the Cincinnati Reds\n",
    "the Cleveland Guardians\n",
    "the Colorado Rockies\n",
    "the Detroit Tigers\n",
    "the Houston Astros\n",
    "the Kansas City Royals\n",
    "the Los Angeles Angels\n",
    "the Los Angeles Dodgers\n",
    "the Miami Marlins\n",
    "the Milwaukee Brewers\n",
    "the Minnesota Twins\n",
    "the New York Mets\n",
    "the New York Yankees\n",
    "the Oakland Athletics\n",
    "the Philadelphia Phillies\n",
    "the Pittsburgh Pirates\n",
    "the San Diego Padres\n",
    "the San Francisco Giants\n",
    "the Seattle Mariners\n",
    "the St. Louis Cardinals\n",
    "the Tampa Bay Rays\n",
    "the Texas Rangers\n",
    "the Toronto Blue Jays\n",
    "the Washington Nationals\n",
    "the Arizona Cardinals\n",
    "the Atlanta Falcons\n",
    "the Carolina Panthers\n",
    "the Chicago Bears\n",
    "the Dallas Cowboys\n",
    "the Green Bay Packers\n",
    "the Detroit Lions\n",
    "the Los Angeles Rams\n",
    "the New York Jets\n",
    "the Washington Commanders\n",
    "the Cleveland Browns\n",
    "the Kansas City Chiefs\n",
    "\"\"\"\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-06T06:04:19.141620Z",
     "iopub.status.busy": "2025-09-06T06:04:19.141372Z",
     "iopub.status.idle": "2025-09-06T06:04:19.145250Z",
     "shell.execute_reply": "2025-09-06T06:04:19.144818Z",
     "shell.execute_reply.started": "2025-09-06T06:04:19.141599Z"
    },
    "id": "bCOLAmkqLlQW",
    "tags": []
   },
   "outputs": [],
   "source": [
    "items_to_like = [item for item in items_to_like.split(\"\\n\") if item.strip() not in [\"\"]]\n",
    "import random\n",
    "random.seed(42)\n",
    "random.shuffle(items_to_like)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "1FWxP6jqLsj1"
   },
   "source": [
    "## Setup matrix\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-06T06:04:21.506323Z",
     "iopub.status.busy": "2025-09-06T06:04:21.506095Z",
     "iopub.status.idle": "2025-09-06T06:04:21.516225Z",
     "shell.execute_reply": "2025-09-06T06:04:21.515768Z",
     "shell.execute_reply.started": "2025-09-06T06:04:21.506307Z"
    },
    "id": "stdluJtaQtuq",
    "tags": []
   },
   "outputs": [],
   "source": [
    "def generate_random_qrel_matrix(num_docs, num_queries, k_per_query):\n",
    "    \"\"\"Generate random qrel matrix with k relevant docs per query.\"\"\"\n",
    "    if num_docs < k_per_query and num_queries > 0 and k_per_query > 0:\n",
    "        print(f\"Error: num_docs ({num_docs}) must be >= k_per_query ({k_per_query})\")\n",
    "        return None\n",
    "\n",
    "    qrels_matrix = np.zeros((num_queries, num_docs), dtype=int)\n",
    "    for i in range(num_queries):\n",
    "        if k_per_query > 0:\n",
    "            relevant_docs = random.sample(range(num_docs), k_per_query)\n",
    "            qrels_matrix[i, relevant_docs] = 1\n",
    "        else:\n",
    "            relevant_docs = []\n",
    "\n",
    "\n",
    "    return qrels_matrix\n",
    "\n",
    "def generate_cycle_qrel_matrix(num_docs, num_queries, k_per_query):\n",
    "    \"\"\"\n",
    "    Generates a qrel matrix with a single large cyclical pattern.\n",
    "\n",
    "    For each query i, it marks documents i to i + k-1 as relevant,\n",
    "    wrapping around the document indices.\n",
    "\n",
    "    e.g., for num_docs=3, num_queries=3, k=2:\n",
    "    Q1 -> D1, D2  [1, 1, 0]\n",
    "    Q2 -> D2, D3  [0, 1, 1]\n",
    "    Q3 -> D3, D1  [1, 0, 1]\n",
    "\n",
    "    Args:\n",
    "        num_docs (int): The total number of documents.\n",
    "        num_queries (int): The total number of queries.\n",
    "        k_per_query (int): The number of relevant documents for each query.\n",
    "\n",
    "    Returns:\n",
    "        np.ndarray: A (num_queries x num_docs) binary matrix.\n",
    "    \"\"\"\n",
    "    if num_queries > num_docs:\n",
    "        print(f\"Warning: For the cycle pattern, it's recommended that num_queries ({num_queries}) <= num_docs ({num_docs}).\")\n",
    "\n",
    "    qrels_matrix = np.zeros((num_queries, num_docs), dtype=int)\n",
    "    for i in range(num_queries):\n",
    "        for j in range(k_per_query):\n",
    "            doc_index = (i + j) % num_docs\n",
    "            qrels_matrix[i, doc_index] = 1\n",
    "    return qrels_matrix\n",
    "\n",
    "def generate_disjoint_qrel_matrix(num_docs, num_queries, k_per_query):\n",
    "    \"\"\"\n",
    "    Generates a qrel matrix with disjoint sets of relevant documents.\n",
    "\n",
    "    Each query is relevant to a unique block of k documents.\n",
    "\n",
    "    e.g., for k=2:\n",
    "    Q1 -> D1, D2    [1, 1, 0, 0, 0, 0]\n",
    "    Q2 -> D3, D4    [0, 0, 1, 1, 0, 0]\n",
    "    Q3 -> D5, D6    [0, 0, 0, 0, 1, 1]\n",
    "\n",
    "    Args:\n",
    "        num_docs (int): The total number of documents.\n",
    "        num_queries (int): The total number of queries.\n",
    "        k_per_query (int): The number of relevant documents for each query.\n",
    "\n",
    "    Returns:\n",
    "        np.ndarray: A (num_queries x num_docs) binary matrix or None if impossible.\n",
    "    \"\"\"\n",
    "    required_docs = num_queries * k_per_query\n",
    "    if required_docs > num_docs:\n",
    "        print(f\"Error: Not enough documents ({num_docs}) for disjoint sets. \"\n",
    "              f\"Need at least {required_docs} for {num_queries} queries with k={k_per_query}.\")\n",
    "        return None\n",
    "\n",
    "    qrels_matrix = np.zeros((num_queries, num_docs), dtype=int)\n",
    "    for i in range(num_queries):\n",
    "        start_idx = i * k_per_query\n",
    "        end_idx = start_idx + k_per_query\n",
    "        qrels_matrix[i, start_idx:end_idx] = 1\n",
    "    return qrels_matrix\n",
    "\n",
    "\n",
    "def generate_dense_qrel_matrix(num_docs, num_queries, k_per_query):\n",
    "    \"\"\"\n",
    "    Generates a qrel matrix from a dense subset of documents.\n",
    "\n",
    "    It finds the smallest number of documents 'n' such that nCk >= num_queries.\n",
    "    It then creates queries for every combination of k documents from that\n",
    "    set of 'n', up to the num_queries limit. All other documents\n",
    "    (from n to num_docs) are not part of any relevance judgments.\n",
    "\n",
    "    Args:\n",
    "        num_docs (int): The total number of documents.\n",
    "        num_queries (int): The maximum number of queries to generate.\n",
    "        k_per_query (int): The number of relevant items per query (the 'k' in nCk).\n",
    "\n",
    "    Returns:\n",
    "        np.ndarray: A (num_queries x num_docs) binary matrix or None if impossible.\n",
    "    \"\"\"\n",
    "    if k_per_query <= 0:\n",
    "        return np.zeros((num_queries, num_docs), dtype=int)\n",
    "\n",
    "    # 1. Find the smallest n such that nCk >= num_queries\n",
    "    n = k_per_query\n",
    "    while True:\n",
    "        try:\n",
    "            # Calculate combinations, if n < k, math.comb raises ValueError\n",
    "            num_combinations = math.comb(n, k_per_query)\n",
    "            if num_combinations >= num_queries:\n",
    "                break\n",
    "        except ValueError:\n",
    "            pass # n is still smaller than k\n",
    "        n += 1\n",
    "        if n > num_docs * 2: # Heuristic break to prevent infinite loops\n",
    "            print(f\"Error: Could not find a suitable 'n' for the dense matrix.\")\n",
    "            return None\n",
    "\n",
    "    if n > num_docs:\n",
    "        print(f\"Error: Not enough documents ({num_docs}) to generate dense set. \"\n",
    "              f\"Need at least {n} documents to create {num_queries} queries with k={k_per_query}.\")\n",
    "        return None\n",
    "\n",
    "    print(f\"Using the first {n} documents to generate dense combinations.\")\n",
    "\n",
    "    # 2. Generate all combinations of k indices from the range [0, n-1]\n",
    "    doc_indices = range(n)\n",
    "    all_combinations = list(itertools.combinations(doc_indices, k_per_query))\n",
    "\n",
    "    # We might generate more combinations than requested, so cap at num_queries\n",
    "    actual_num_queries = min(num_queries, len(all_combinations))\n",
    "    qrels_matrix = np.zeros((actual_num_queries, num_docs), dtype=int)\n",
    "\n",
    "    # 3. Create the qrel matrix from the combinations\n",
    "    for i in range(actual_num_queries):\n",
    "        combination = all_combinations[i]\n",
    "        qrels_matrix[i, list(combination)] = 1\n",
    "\n",
    "    return qrels_matrix\n",
    "\n",
    "\n",
    "def calculate_min_num_queries(num_queries, num_docs, k_per_query):\n",
    "  n = k_per_query\n",
    "  while True:\n",
    "      try:\n",
    "          # Calculate combinations, if n < k, math.comb raises ValueError\n",
    "          num_combinations = math.comb(n, k_per_query)\n",
    "          if num_combinations >= num_queries:\n",
    "              break\n",
    "      except ValueError:\n",
    "          pass # n is still smaller than k\n",
    "      n += 1\n",
    "      if n > num_docs * 2: # Heuristic break to prevent infinite loops\n",
    "          print(f\"Error: Could not find a suitable 'n' for the dense matrix.\")\n",
    "          return None\n",
    "  return num_combinations, n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-06T06:04:27.650893Z",
     "iopub.status.busy": "2025-09-06T06:04:27.650663Z",
     "iopub.status.idle": "2025-09-06T06:04:27.661648Z",
     "shell.execute_reply": "2025-09-06T06:04:27.661182Z",
     "shell.execute_reply.started": "2025-09-06T06:04:27.650877Z"
    },
    "id": "F7EQALPNLKhA",
    "tags": []
   },
   "outputs": [],
   "source": [
    "def generate_ir_dataset(initial_items, qrels_matrix, min_items=10):\n",
    "    \"\"\"\n",
    "    Procedurally generates an IR dataset including a corpus, queries, and a qrels matrix.\n",
    "\n",
    "    Args:\n",
    "        initial_items (list): A list of initial items to be placed in the qrels.\n",
    "        qrels_matrix (np.ndarray): A binary matrix (M x N) where M is the number of queries\n",
    "                                   and N is the number of documents (people). A '1' indicates\n",
    "                                   a relevance judgment.\n",
    "        min_items (int): The minimum number of additional items to assign to each person.\n",
    "    \"\"\"\n",
    "    num_queries, num_people = qrels_matrix.shape\n",
    "    people_items = {f\"person_{i}\": set() for i in range(num_people)}\n",
    "\n",
    "    # --- 1. Prepare Items & Queries ---\n",
    "    # This section generates the items for each query.\n",
    "    available_items_for_queries = list(initial_items)\n",
    "    random.shuffle(available_items_for_queries)\n",
    "    if len(available_items_for_queries) < num_queries:\n",
    "        raise ValueError(f\"Not enough unique items ({len(available_items_for_queries)}) for {num_queries} queries.\")\n",
    "    queries = {f\"query_{i}\": [available_items_for_queries.pop()] for i in range(num_queries)}\n",
    "    used_initial_items_for_queries = {item[0] for item in queries.values()}\n",
    "    conflict_pairs = set() # No conflicts for s=1\n",
    "\n",
    "\n",
    "    # --- 2. Populate Qrels and Assign Query Items ---\n",
    "    # Assign the query items to all people who are marked as relevant.\n",
    "    print(\"Assigning query items to relevant people...\")\n",
    "    for i in tqdm.tqdm(range(num_queries)):\n",
    "        query_id = f\"query_{i}\"\n",
    "        items_for_query = queries[query_id]\n",
    "        relevant_people_indices = np.where(qrels_matrix[i] == 1)[0]\n",
    "        for person_idx in relevant_people_indices:\n",
    "            person_id = f\"person_{person_idx}\"\n",
    "            people_items[person_id].update(items_for_query)\n",
    "\n",
    "    # --- 3. Assign Additional Items (Conflict-Aware) ---\n",
    "    # For every person, add `min_items` more items, ensuring no conflicts are created.\n",
    "    unused_initial_items = [item for item in initial_items if item not in used_initial_items_for_queries]\n",
    "    if unused_initial_items:\n",
    "      print(f\"Assigning additional {min_items} items to each person (conflict-aware)...\")\n",
    "      for person_idx in tqdm.tqdm(range(num_people)):\n",
    "          person_id = f\"person_{person_idx}\"\n",
    "\n",
    "          # Find which queries this person is relevant to, to identify their \"allowed\" conflicts.\n",
    "          relevant_query_indices = np.where(qrels_matrix[:, person_idx] == 1)[0]\n",
    "          allowed_conflicts = {frozenset(queries[f\"query_{q_idx}\"]) for q_idx in relevant_query_indices}\n",
    "          current_items = len(people_items[person_id])\n",
    "\n",
    "          items_to_add = set()\n",
    "          while len(items_to_add) + current_items < min_items:\n",
    "              # Sample a new item\n",
    "              new_item = random.choice(unused_initial_items)\n",
    "\n",
    "              # A person's current items are what they got from qrels + what we've added so far.\n",
    "              current_and_pending_items = people_items[person_id].union(items_to_add)\n",
    "\n",
    "              # Fast check: only need to check for new conflicts involving the new_item.\n",
    "              is_safe_to_add = True\n",
    "              for existing_item in current_and_pending_items:\n",
    "                  potential_conflict = frozenset({existing_item, new_item})\n",
    "                  if potential_conflict in conflict_pairs and potential_conflict not in allowed_conflicts:\n",
    "                      is_safe_to_add = False\n",
    "                      break # Conflict found, this item is not safe.\n",
    "\n",
    "              if is_safe_to_add:\n",
    "                  items_to_add.add(new_item)\n",
    "\n",
    "          people_items[person_id].update(items_to_add)\n",
    "    else:\n",
    "        print(\"Warning: No unused initial items available for profile assignment.\")\n",
    "\n",
    "    # Convert sets back to lists for the final output\n",
    "    people_items_list = {person_id: list(items) for person_id, items in people_items.items()}\n",
    "\n",
    "    # --- 4. Finalize and Return ---\n",
    "    qrels = {f\"query_{i}\": [f\"person_{idx}\" for idx in np.where(row == 1)[0]] for i, row in enumerate(qrels_matrix)}\n",
    "\n",
    "\n",
    "    finished_queries = {}\n",
    "    for query_id, items in queries.items():\n",
    "        if len(items) > 1:\n",
    "            item_str = ' and '.join(items)\n",
    "        else:\n",
    "            item_str = items[0]\n",
    "        finished_queries[query_id] = f\"Who likes {item_str}?\"\n",
    "\n",
    "    # convert corpus into list with people\n",
    "    num_users = len(people_items_list)\n",
    "    generated_names = [\n",
    "        f\"{random.choice(unique_names).capitalize()} {random.choice(unique_surnames).lower().capitalize()}\"\n",
    "        for _ in range(num_users*2)\n",
    "    ]\n",
    "    # shuffle the names\n",
    "    random.shuffle(generated_names)\n",
    "    # remove duplicates\n",
    "    generated_names = list(set(generated_names))[:num_users]\n",
    "    print(f\"Generated {len(generated_names)} unique user names for all documents.\")\n",
    "\n",
    "    person_map = {}\n",
    "    finished_corpus = {}\n",
    "    for i, (person_id, likes) in enumerate(people_items_list.items()):\n",
    "        user_name = generated_names[i] # Use index to ensure consistent mapping\n",
    "        person_map[person_id] = user_name\n",
    "        # Join all but the last with commas\n",
    "        all_but_last = ', '.join(likes[:-1])\n",
    "        # Add 'and' before the last item\n",
    "        last_item = likes[-1]\n",
    "        finished_corpus[user_name] = f\"{user_name} likes {all_but_last} and {last_item}.\"\n",
    "\n",
    "    # now replace the qrels with the user names\n",
    "    finished_qrels = {}\n",
    "    for key, value in qrels.items():\n",
    "        finished_qrels[key] = {person_map[person]: 1 for person in value}\n",
    "\n",
    "    return {\n",
    "        \"corpus\": finished_corpus,\n",
    "        \"queries\": finished_queries,\n",
    "        \"qrels\": finished_qrels,\n",
    "    }"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "NZzHYxwDXJ8S"
   },
   "source": [
    "## Generate the dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-09-06T06:04:31.716671Z",
     "iopub.status.busy": "2025-09-06T06:04:31.716453Z",
     "iopub.status.idle": "2025-09-06T06:04:31.740849Z",
     "shell.execute_reply": "2025-09-06T06:04:31.740402Z",
     "shell.execute_reply.started": "2025-09-06T06:04:31.716656Z"
    },
    "id": "hm8bS2jjQbGX",
    "outputId": "5f615edb-1119-449b-cf2a-6ed396904771",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Using the first 46 documents to generate dense combinations.\n",
      "Assigning query items to relevant people...\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 1000/1000 [00:00<00:00, 254616.89it/s]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Assigning additional 45 items to each person (conflict-aware)...\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 46/46 [00:00<00:00, 20405.92it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Generated 46 unique user names for all documents.\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "# generate the small version. Change this to generate a longer one by switching num_docs to 50k\n",
    "qrels_small = generate_dense_qrel_matrix(num_docs=46, num_queries=1000, k_per_query=2)\n",
    "ir_dataset_small = generate_ir_dataset(\n",
    "    items_to_like,\n",
    "    qrels_small,\n",
    "    min_items=45,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "FeK9JFg1k563"
   },
   "source": [
    "## Inpsect the data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-09-06T06:04:34.895939Z",
     "iopub.status.busy": "2025-09-06T06:04:34.895707Z",
     "iopub.status.idle": "2025-09-06T06:04:34.900359Z",
     "shell.execute_reply": "2025-09-06T06:04:34.899837Z",
     "shell.execute_reply.started": "2025-09-06T06:04:34.895923Z"
    },
    "id": "2aq9eGREMJYi",
    "outputId": "9c0156b7-6b1f-47a8-cfdd-a88a8c6c9936",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Examples from the generated dataset:\n",
      "------------------------------\n",
      "Sample Queries, Relevant People, and Associated Items:\n",
      "Query: query_0 - Question: Who likes Joshua Trees?\n",
      "  Relevant People: ['Kodie Pearson', 'Hamzah Perez']\n",
      "    Kodie Pearson: Kodie Pearson likes Hydrangeas, Bassoons, Pangolins, Mosaic, Glaciers, Asymmetry, Disco Music, Barley, Sapphires, Symphonies, Joshua Trees, Caracals, Slide Rules, Traveling, White Pepper, Halibut, Cards Against Humanity, Elm Trees, Alternative Rock, Cartography, Tapirs, Cheerios, Fables, Oceanic Trenches, Shasta Daisies, Giant Isopods, Limes, Licorice, River Otters, Scuba Diving, Chairs, Spinach, Praying Mantises, Horror Literature, Crocheting, Patterns, Pansies, Candle Making, Alligators, Quokkas, Creativity, The Aztec Empire, Snow Leopards, Parakeets and Soy Sauce.\n",
      "    Hamzah Perez: Hamzah Perez likes Drum Kits, Bridge, Compasses, Lunar Eclipses, Rice Cakes, Cinnamon Rolls, Cobras, the Minnesota Twins, Dragon Fruits, Fennel, the Houston Astros, Joshua Trees, Dryers, Highlighters, Watercolor Painting, Cymbals, Picture Frames, Spaghetti Bolognese, Walking Leaves, Mops, Swamps, Lakes, Stand-up Comedy, Binturongs, Apple Cider, Kangaroos, Animators, Blackberries, Karate, Poblano Peppers, Public Health, Sparkling Water, Stir-fries, Chess, Mussels, Mixology, Cherries, Xylophones, Puzzle Video Games, Crows, Software Developers, Paramedics, Caves, Pepperoni Pizzas and Magic: The Gathering.\n",
      "----------\n",
      "Query: query_1 - Question: Who likes Slide Rules?\n",
      "  Relevant People: ['Kodie Pearson', 'Rylay Gill']\n",
      "    Kodie Pearson: Kodie Pearson likes Hydrangeas, Bassoons, Pangolins, Mosaic, Glaciers, Asymmetry, Disco Music, Barley, Sapphires, Symphonies, Joshua Trees, Caracals, Slide Rules, Traveling, White Pepper, Halibut, Cards Against Humanity, Elm Trees, Alternative Rock, Cartography, Tapirs, Cheerios, Fables, Oceanic Trenches, Shasta Daisies, Giant Isopods, Limes, Licorice, River Otters, Scuba Diving, Chairs, Spinach, Praying Mantises, Horror Literature, Crocheting, Patterns, Pansies, Candle Making, Alligators, Quokkas, Creativity, The Aztec Empire, Snow Leopards, Parakeets and Soy Sauce.\n",
      "    Rylay Gill: Rylay Gill likes Goat Cheese, Thin Mints, Satisfaction, Quiches, Rubik's Cubes, Minimalism, Soap Making, Gecko Lizards, Architecture, Sea Lions, Quilts, Cloves, Futurism, Dragon Fruits, Baking Powder, Barbershop quartets, Patience, Soccer, Slide Rules, Editors, Smoked Paprika, Cool Breezes, Community, Televisions, Eyeglasses, Vegan Cheese Pizza, Sausages, Optimism, Tango Dancing, Volleyball, Saiga Antelopes, Western Movies, Cassette Players, Walruses, Wombats, Monarch Butterflies, Herbal Tea, Mechanics, Cheesecake, Amethyst, Disc Golf, Mandolins, Starfish, Armadillos and Ukuleles.\n",
      "----------\n",
      "Query: query_2 - Question: Who likes Oceanic Trenches?\n",
      "  Relevant People: ['Kodie Pearson', 'Latif Burns']\n",
      "    Kodie Pearson: Kodie Pearson likes Hydrangeas, Bassoons, Pangolins, Mosaic, Glaciers, Asymmetry, Disco Music, Barley, Sapphires, Symphonies, Joshua Trees, Caracals, Slide Rules, Traveling, White Pepper, Halibut, Cards Against Humanity, Elm Trees, Alternative Rock, Cartography, Tapirs, Cheerios, Fables, Oceanic Trenches, Shasta Daisies, Giant Isopods, Limes, Licorice, River Otters, Scuba Diving, Chairs, Spinach, Praying Mantises, Horror Literature, Crocheting, Patterns, Pansies, Candle Making, Alligators, Quokkas, Creativity, The Aztec Empire, Snow Leopards, Parakeets and Soy Sauce.\n",
      "    Latif Burns: Latif Burns likes Skimboarding, Ciabatta, Nectarines, Blues Music, Power Walking, Monstera, Coasters, Wild Rice, Handbags, Worcestershire Sauce, Envelopes, Watercolor Painting, French Fries, Geysers, Sociology, Cool Breezes, Oceanic Trenches, Neuroscience, Gerbils, Raspberries, the Tampa Bay Rays, Historical Fiction, Smartphones, Psychology, Glistening Dewdrops, Archery, Nurses, Family Movies, Stair Climbing, Yeti Crabs, Double Basses, Horseshoe Crabs, Coconut Macaroons, Lapis Lazuli, Bearded Dragon Lizards, Toffee, Vegetable Oil, Horses, Affection, Falafel, Mashed Potatoes, Mountain Biking, Gladiolus, Venus and Gerenuks.\n",
      "----------\n"
     ]
    }
   ],
   "source": [
    "# Display some examples from the generated dataset\n",
    "print(\"Examples from the generated dataset:\")\n",
    "print(\"-\" * 30)\n",
    "\n",
    "# Display a few queries and their associated items\n",
    "print(\"Sample Queries, Relevant People, and Associated Items:\")\n",
    "\n",
    "for i, (query_id, items) in enumerate(ir_dataset_small['queries'].items()):\n",
    "    if i < 3: # Display first 3 queries\n",
    "        print(f\"Query: {query_id} - Question: {items}\")\n",
    "        # Find relevant people for this query from the qrels dictionary\n",
    "        relevant_people_names = list(ir_dataset_small['qrels'][query_id].keys())\n",
    "        print(f\"  Relevant People: {relevant_people_names}\")\n",
    "\n",
    "        # Display the items for each relevant person\n",
    "        if relevant_people_names:\n",
    "            for relevant_person_name in relevant_people_names:\n",
    "                 # Get the original person_id using the name_to_person_id_map\n",
    "                 person_items = ir_dataset_small[\"corpus\"].get(relevant_person_name)\n",
    "                 print(f\"    {relevant_person_name}: {person_items}\")\n",
    "\n",
    "        else:\n",
    "             print(\"  No relevant people found for this query.\")\n",
    "\n",
    "        print(\"-\" * 10)\n",
    "    else:\n",
    "        break"
   ]
  }
 ],
 "metadata": {
  "colab": {
   "collapsed_sections": [
    "EwOtsgFBjx2P",
    "FAkejndglTis",
    "na_P_9nHLYRW",
    "1FWxP6jqLsj1"
   ],
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
